www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第12章 常微分方程(组)数值求解/examp12_2_2.m

    function examp12_2_2
tspan = [0,10];%变量求解区间
y0 = [3 4];%初值
a = 100;%参数赋值
b = 50;
options = odeset('RelTol',0.001);%设置相对误差
tic;
%需要把ode45输入参数都写全,待传递的参数a,b写在后面。下面ode23,ode15s类似
[t45,y45] = ode45(@DyDtSubFun,tspan,y0,options,a,b);
time45 = toc;
disp(['ode45计算点数(子函数表示微分方程):',num2str(length(t45)),...
    ';所用时间:',num2str(time45),'s.'])
tic;
[t23,y23] = ode23(@DyDtSubFun,tspan,y0,options,a,b);
time23 = toc;
disp(['ode23计算点数(子函数表示微分方程):',num2str(length(t23)),...
    ';所用时间:',num2str(time23),'s.'])
tic;
[t15s,y15s] = ode15s(@DyDtSubFun,tspan,y0,options,a,b);
time15s = toc;
disp(['ode15s计算点数(子函数表示微分方程):',num2str(length(t15s)),...
    ';所用时间:',num2str(time15s),'s.'])
%用匿名函数表示微分方程
DyDtAnony = @(t,y,a,b) [a - (b+1)*y(1)+y(1).^2*y(2);b*y(1)-y(1).^2*y(2)];
tic;
[t15sAnony,y15sAnony] = ode15s(DyDtAnony,tspan,y0,options,a,b);
time15sAnony = toc;
disp(['ode15s计算点数(匿名函数表示微分方程)::',num2str(length(t15sAnony)),...
    ';所用时间:',num2str(time15sAnony),'s.'])
%画图展示
figure;
subplot(131);
plot(t23,y23,'k-');xlabel('\itt','fontsize',16);
title('子函数形式/ode23')
subplot(132);
plot(t15s,y15s,'k--');xlabel('\itt','fontsize',16);
title('子函数形式/ode15s')
subplot(133);
plot(t15sAnony,y15sAnony,'k:');xlabel('\itt','fontsize',16);
title('匿名函数形式/ode15s')

%用子函数来表示微分方程
function dy = DyDtSubFun(t,y,a,b)
dy(1,1) = a - (b+1)*y(1)+y(1).^2*y(2);
dy(2,1) = b*y(1)-y(1).^2*y(2);